#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<int> a[100005]; // a[i][j]表示矩阵第i行第j列的数字
int r[100005][2][35]; // r[i][j][k]表示第i行二进制第k位数字是j的数量
int c[100005][2][35]; // c[i][j][k]表示第i列二进制第k位数字是j的数量
int sum[2][35]; // sum[i][j]表示矩阵中二进制第j位为i的数字数量
long long ans = 0; // 答案
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++) { // 循环输入矩阵
    for (int j = 0; j < m; j++) {
      int x;
      cin >> x;
      a[i].push_back(x);
      for (int k = 0; k < 30; k++) { // 循环取第k位（从低位开始）
        if (x % 2 == 0) { // 统计行，列，整体中0和1的数量
          r[i][0][k]++;
          c[j][0][k]++;
          sum[0][k]++;
        } else {
          r[i][1][k]++;
          c[j][1][k]++;
          sum[1][k]++;
        }
        x /= 2;
      }
    }
  }
  for (int i = 0; i < n; i++) { // 枚举删除a[i][j]后的结果
    for (int j = 0; j < m; j++) {
      long long t = 0;
      long long w = 1; // 位权
      int x = a[i][j];
      for (int k = 0; k < 30; k++) { // 枚举每一位
        if (x % 2 == 0) {
          t += (sum[1][k] - r[i][1][k] - c[j][1][k]) * w;
        } else {
          t += (sum[0][k] - r[i][0][k] - c[j][0][k]) * w;
        }
        x /= 2;
        w *= 2;
      }
      ans = max(ans, t); // 取最大值
    }
  }
  cout << ans;
  return 0;
}